/****************************************************/
// MSP432P401R
// 配置Keil独立空工程 (已将ti固件库打包至工程)
// Keil工程已配置开启FPU
// Bilibili：m-RNA
// E-mail:m-RNA@qq.com
// 创建日期:2021/9/28
/****************************************************/

#include "delay.h"
#include "led.h"
#include "max31865.h"
#include "oled.h"
#include "slitherFilter.h"
#include "string.h"
#include "sysinit.h"
#include "usart.h"

char OLED_String_Buf[128] = "";

double temperature_Cal(uint16_t data)
{
#define MAX_ORDER 2
    const double xishu[MAX_ORDER + 1] = {-2.55943445E+02, 3.30033870E-02, 7.58802046E-08}; // 阶数依次递增

    double ans = xishu[0];
    double temp = data;
    ans += temp * xishu[1];
    temp *= data;
    ans += temp * xishu[2];
    return ans;
}

int main(void)
{
    LED_Init(); // 第5讲 LED配置
    LED_RED_On();

    SysInit();         // 第3讲 时钟配置
    uart_init(115200); // 第7讲 串口配置
    delay_init();      // 第4讲 滴答延时
    OLED_Init();       // 第6讲 OLED配置

    /*开始填充初始化代码*/
    uint16_t adcVal = 0;
    double temperatureVal = 0;

    MAX31865_Init(); // PT100模块初始化
    for (size_t i = 0; i < FIFO_BUF_MAX_LENGTH; ++i)
    {
        fifo(MAX31865_Get_ADC());
		LED_RED_Tog();
    }

    /*停止填充初始化代码*/

    printf("Hello,MSP432!\r\n");
    MAP_Interrupt_enableMaster(); // 开启总中断
    LED_RED_Off();
    while (1)
    {
        while (!MAX31865_RDY)
            ;
        /*开始填充用户代码*/
        temperatureVal = temperature_Cal(fifoAverage());
        sprintf(OLED_String_Buf, "%02.2f      ", temperatureVal);
        // printf("%s\r\n", OLED_String_Buf);
        OLED_ShowString(0, 0, (uint8_t *) OLED_String_Buf, 16);

        adcVal = MAX31865_Get_ADC();
        fifo(adcVal);
        sprintf(OLED_String_Buf, "%u      ", adcVal);

        OLED_ShowString(0, 3, (uint8_t *) OLED_String_Buf, 16);

        printf("%s\r\n", OLED_String_Buf);

        LED_B_Tog();
        // delay_ms(100);
        /*停止填充用户代码*/
    }
}
